package leetcode31_40;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.*;

/**
 * @author shhjiang_001
 * @create 2020-06-16 18:32
 */

       /*
       给定一个无重复元素的数组 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。
        candidates 中的数字可以无限制重复被选取。
        说明：
        所有数字（包括 target）都是正整数。
        解集不能包含重复的组合。
        示例 1:
        输入: candidates = [2,3,6,7], target = 7,
        所求解集为:
        [
        [7],
        [2,2,3]
        ]
        */
public class Solution39 {
    public static List<List<Integer>> resList = new ArrayList<>();
    public List<List<Integer>> combinationSum1(int[] candidates, int target) {
            if (candidates.length==0) return null;
            ArrayList<Integer> list = new ArrayList<>();
            method(candidates,target,list,0);
            return resList;
        }

    private void method(int[] candidates, int target,List<Integer> list,int pos) {
        if (target == 0){
            resList.add(new ArrayList<>(list));
        }
        for (int i = pos; i < candidates.length; i++) {
            if (target-candidates[i] >= 0){
                list.add(candidates[i]);
                method(candidates,target-candidates[i],list,i);
                list.remove(list.size()-1);
            }else {
                break;
            }

        }
    }

//    List<List<Integer>> res=new ArrayList<>();
//    public List<List<Integer>> combinationSum(int[] candidates, int target) {
//        if (candidates==null)return res;
//        dfs(target,0,new Stack<Integer>(),candidates);
//        return res;
//    }
//    //深度遍历
//    private void dfs(int target, int index, Stack<Integer> pre, int[] candidates) {
//        //等于零说明结果符合要求
//        if (target==0){
//            res.add(new ArrayList<>(pre));
//            return;
//        }
//        //遍历，index为本分支上一节点的减数的下标
//        for (int i=index;i<candidates.length;i++){
//            //如果减数大于目标值，则差为负数，不符合结果
//            if (candidates[i]<=target){
//                pre.push(candidates[i]);
//                //目标值减去元素值
//                dfs(target-candidates[i],i,pre, candidates);
//                //每次回溯将最后一次加入的元素删除
//                pre.pop();
//            }
//        }
//    }

    @Test
    public void test() {
        Solution39 solution39 = new Solution39();
//        System.out.println(Arrays.asList(new int[]{1, 2, 3}).toString());
        solution39.combinationSum1(new int[]{2,3,5},8);
    }

}
